今天來認識一下 findBy**
與 findAllBy**
。
findBy**
export default function Applications(){
const [isLoggedIn, setIsLoggedIn] = useState(false);
useEffect(() => {
setTimeout(() => setIsLoggedIn(true), 500);
}, [])
return(
<>
<h2>User Info</h2>
{ isLoggedIn
? <LogOutBtn setIsLoggedIn={setIsLoggedIn} />
: <LogInBtn setIsLoggedIn={setIsLoggedIn} />
}
</>
)
}
撰寫測試:
describe("Logging", () => {
test("Render LogOut Button When user logs in!", () => {
render(<Applications />);
const logOutBtn = screen.getByRole("button", {
name: "Log Out"
});
expect(logOutBtn).toBeInTheDocument();
});
});
測次結果:
FAIL src/components/logging/logging.test.tsx
● Logging › Render LogOut Button When user logs in!TestingLibraryElementError: Unable to find an accessible element with the role "button" and name "Log Out"
將測試方法 getByRole
改成 findByRole
:加入 async-await
describe("Logging", () => {
test("Render LogOut Button When user logs in!", async() => {
render(<Applications />);
const logOutBtn = await screen.findByRole("button", {
name: "Log Out"
});
expect(logOutBtn).toBeInTheDocument();
});
});
測次結果:
PASS src/components/logging/logging.test.tsx
findAllBy**
export default function Applications(){
const [isLoggedIn, setIsLoggedIn] = useState(false);
useEffect(() => {
setTimeout(() => setIsLoggedIn(true), 500);
}, [])
return(
<>
<h2>User Info</h2>
{ isLoggedIn
? <Hobbies hobbies={["Sleeping", "Cooking", "Eating"]}/>
: null
}
</>
)
}
撰寫測試:
describe("Hobbies By Logging State", () => {
// 檢查 <li> 多個節點
test("Render Listitems correctlly!", async() => {
render(<Applications />);
const listItemElements = await screen.findAllByRole("listitem");
expect(listItemElements).toHaveLength(listItemElements.length);
})
})
測次結果:
PASS src/components/hobbies/hobbies.test.tsx
find
query 超過預設 1000 毫秒我們可以透過 findBy**
與 findAllBy**
的第三個參數屬性 timeout
:自定義等待時間。
describe("Hobbies By Logging State", () => {
// 檢查 <li> 多個節點
test("Render Listitems correctlly!", async() => {
render(<Applications />);
const listItemElements = await screen.findAllByRole(
"listitem",
{},
{timeout: 2000}
);
expect(listItemElements).toHaveLength(listItemElements.length);
})
})
Query | 使用時機 | 返回內容 |
---|---|---|
getBy** getAllBy** |
當測試 DOM node 是否存在的情況。 | 成功,返回 Element; 失敗,返回 Error。 |
queryBy** queryAllBy** |
當測試 DOM node 是否不存在(預期條件應該不存在),但不希望測試報錯的情況。 | 成功,返回 Element; 失敗,返回 null。 |
findBy** findAllBy** |
當測試 DOM node 一開始不存在,但後續觸發事件而存在的情況。 | 成功,返回 fulfilled Promise; 失敗,返回 rejected Promise。 |